<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实验三：理解Buffer Overflow漏洞</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            display: flex;
            flex-direction: column;
            height: 100vh;
        }
        .navbar {
            display: flex;
            justify-content: space-between;
            align-items: center;
            background-color: #007BFF;
            color: white;
            padding: 10px 20px;
        }
        .navbar img {
            height: 40px;
        }
        .navbar .user-info {
            display: flex;
            align-items: center;
        }
        .navbar .user-info span {
            margin-right: 10px;
        }
        .navbar .user-info button {
            background-color: #0056b3;
            color: white;
            border: none;
            padding: 5px 10px;
            cursor: pointer;
        }
        .container {
            display: flex;
            flex: 1;
        }
        .sidebar {
            width: 200px;
            background-color: #f8f9fa;
            padding: 20px;
            box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);
        }
        .sidebar ul {
            list-style: none;
            padding: 0;
        }
        .sidebar ul li {
            margin: 15px 0;
        }
        .sidebar ul li a {
            text-decoration: none;
            color: #333;
        }
        .main-content {
            flex: 1;
            padding: 20px;
            background-color: #fff;
        }
        h1, h2, h3 {
            color: #007BFF;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        table th, table td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: center;
        }
        table th {
            background-color: #007BFF;
            color: white;
        }
        table tr:nth-child(even) {
            background-color: #f9f9f9;
        }
        .mark {
            color: red;
            font-weight: bold;
        }
        .image {
            max-width: 100%;
            height: auto;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <!-- 顶部导航栏 -->
    <div class="navbar">
        <img src="./img/logo.png" alt="LOGO">
        <div class="user-info">
            <span>张三</span>
            <button>退出登录</button>
        </div>
    </div>

    <!-- 页面容器 -->
    <div class="container">
        <!-- 侧边栏 -->
        <div class="sidebar">
            <ul>
                <li><a href="student.html">仪表盘</a></li>
                <li><a href="#">实验查看</a></li>
                <li><a href="#">作业提交</a></li>
                <li><a href="#">成绩查询</a></li>
                <li><a href="#">通知公告</a></li>
                <li><a href="#">帮助与反馈</a></li>
            </ul>
        </div>

        <!-- 主内容区 -->
        <div class="main-content">
            <h1>实验三：理解Buffer Overflow漏洞</h1>

            <h2>1. 简介</h2>
            <p>这项任务要求对两个具有不同安全漏洞的程序总共发起五次攻击。通过本次实验，你将能够取得以下收获：</p>
            <ol>
                <li>你将了解，当程序未能充分保护自己免受缓冲区溢出攻击时，攻击者可以利用这些安全漏洞的不同手段。</li>
                <li>借助这次实验，你将更深入地了解如何编写更安全的程序，以及编译器和操作系统提供的一些功能，这些功能可以使程序不那么容易受到攻击。</li>
                <li>你将更深入地了解x86-64机器代码的堆栈和参数传递机制。</li>
                <li>你将更深入地了解x86-64指令的编码方式。</li>
                <li>你将更深入地使用GDB和OBJDUMP等调试工具。</li>
            </ol>
            <p class="mark">请注意：在这次实验中，你将亲身体验到如何利用操作系统和网络服务器的安全漏洞。我们的目标是帮助你深入了解程序的运行原理，以及这些安全漏洞的本质，以便你在编写系统代码时能够避免重蹈覆辙。我们坚决反对任何形式的非法攻击，以获取对系统资源的未授权访问。</p>

            <h2>2. 实验准备</h2>
            <h3>2.1 文件获取</h3>
            <p>在4S平台上获取你的个人文件。</p>
            <img src="media/image1.png" alt="文件获取" class="image">
            <p>【提示】在ubuntu上运行<code>gcc --version</code>，如果版本低于7.5.0，请参考下列链接更新gcc版本。</p>
            <p><a href="https://blog.csdn.net/quxuexi/article/details/121501679">Ubuntu升级GCC版本-CSDN博客</a></p>
            <p>请将<code>targetxxxxxxxxxxx.tar</code>文件保存在你打算进行工作的虚拟机中。然后输入命令：<code>tar -xvf target[学号].tar</code>。这将解压出一个名为<code>target[学号]</code>的目录，其中包含下面描述的文件。</p>
            <p class="mark">警告：如果你在一台PC上使用诸如Winzip之类的工具，或者让你的浏览器来解压<code>targetxxxxxxxxxxx.tar</code>文件，你可能会面临可执行文件权限位被错误重置的风险。</p>

            <h3>2.2 注意事项</h3>
            <p>以下是关于本实验有效解决方案的一些重要规则的总结：</p>
            <ul>
                <li>你必须在与生成目标文件相同的类似机器上完成作业。</li>
                <li>你的解决方案不能使用攻击来规避程序中的验证代码。</li>
                <li>你只能从文件<code>rtarget</code>中，使用位于函数<code>start_farm</code>和<code>end_farm</code>地址范围内的内容来构建代码片段（gadgets）。</li>
            </ul>

            <h2>3. 目标程序</h2>
            <p><code>CTARGET</code>和<code>RTARGET</code>都会从标准输入中读取字符串。它们是通过下面定义的<code>getbuf</code>函数来完成这一操作的：</p>
            <pre>
unsigned getbuf() {
    char buf[BUFFER_SIZE];
    Gets(buf);
    return 1;
}
            </pre>
            <p><code>Gets</code>函数类似于标准库中的<code>gets</code>函数——它从标准输入读取一个字符串（以<code>\n</code>或文件结束符为终止符），并将其（以及一个空终止符）存储在指定的目标位置。</p>
            <p class="mark">重要提示：你所使用的字符串在任何中间位置都不得包含字节值<code>0x0a</code>，因为这是换行符（<code>\n</code>）的ASCII码。当<code>Gets</code>遇到这个字节时，它会认为你意图终止字符串。</p>

            <h2>4. 第一部分：代码注入攻击</h2>
            <h3>4.1 第一关</h3>
            <p>在第一关，你不需要注入新的代码。相反，你的利用字符串将引导程序执行一个已存在的过程。</p>
            <p>你的任务是让<code>CTARGET</code>在<code>getbuf</code>执行其返回语句时执行<code>touch1</code>的代码，而不是返回到<code>test</code>。</p>

            <h3>4.2 第二关</h3>
            <p>第二关包含将一小段代码作为利用字符串的一部分进行注入。</p>
            <p>这一关的任务是让<code>CTARGET</code>执行<code>touch2</code>的代码而不是返回到<code>test</code>。你必须让<code>touch2</code>看起来好像你已经将你的<code>cookie</code>作为参数传递给了它。</p>

            <h3>4.3 第三关</h3>
            <p>第三关同样涉及代码注入攻击，但这次是通过传递一个字符串作为参数。</p>
            <p>这一关任务是让<code>CTARGET</code>执行<code>touch3</code>的代码，而不是返回到<code>test</code>。你必须让<code>touch3</code>看起来好像你已经传递了一个表示你的<code>cookie</code>的字符串作为它的参数。</p>

            <h2>5. 第二部分：面向返回的编程（ROP）</h2>
            <p>对程序<code>RTARGET</code>执行代码注入攻击比对<code>CTARGET</code>要困难得多，因为它使用了两项技术来阻止此类攻击：</p>
            <ul>
                <li>它使用了随机化技术，使得每次运行时栈的位置都不同。</li>
                <li>它将保存栈的内存区域标记为非可执行。</li>
            </ul>
            <p>幸运的是，一些聪明的人已经想出了在程序中执行现有代码来获得有效信息的策略，而不是注入新代码。这种策略最普遍的形式被称为面向返回的编程（Return-Oriented Programming，ROP）。</p>

            <h3>5.1 第四关</h3>
            <p>对于第四关，你将重复第二关的攻击，但这次是在程序<code>RTARGET</code>上，使用来自你的"农场Gadget"的小工具。</p>

            <h3>5.2 第五关</h3>
            <p>第五关要求你对<code>RTARGET</code>进行ROP攻击，以调用<code>touch3</code>函数，并传递一个指向你的<code>cookie</code>字符串表示的指针。</p>
        </div>
    </div>
</body>
</html>